www.gusucode.com > VC++ 聊天室系统+开发文档 > VC++ 聊天室系统+开发文档/code/ChatRoomSever/UserList.cpp

    // UserList.cpp : implementation file
//

#include "stdafx.h"
#include "ChatRoomServer.h"
#include "UserList.h"
#include "ChatServer.h"

extern ChatServer* g_pchatserver; 
extern ULNode* g_puserlist;
extern HANDLE	g_hClientInfoMutex;
extern CString	g_smsg;


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CUserList dialog

//static member initialize
int	CUserList::objcount = 0;

CUserList::CUserList(CWnd* pParent /*=NULL*/)
	: CDialog(CUserList::IDD, pParent)
{
	//{{AFX_DATA_INIT(CUserList)
	//}}AFX_DATA_INIT
	objcount++;
}

BOOL CUserList::HasObject()
{
	if(objcount<1) return FALSE;
	else return TRUE;
}

void CUserList::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CUserList)
	DDX_Control(pDX, IDC_USERLIST, m_ListCtrl);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CUserList, CDialog)
	//{{AFX_MSG_MAP(CUserList)
	ON_MESSAGE(WM_USERIN,OnUserIn)
	ON_MESSAGE(WM_USERQUIT,OnUserQuit)
	ON_BN_CLICKED(IDC_BUTTON_ADDTODISABLELIST, OnButtonAddtodisablelist)
	ON_BN_CLICKED(IDC_BUTTON_LETOUT, OnButtonLetout)
	ON_WM_CLOSE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CUserList message handlers

BOOL CUserList::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	LV_COLUMN lvcol;
	 
    ListView_SetExtendedListViewStyle(m_ListCtrl.GetSafeHwnd(), LVS_EX_GRIDLINES); //Show gridlines
	lvcol.mask=LVCF_FMT|LVCF_SUBITEM|LVCF_TEXT|LVCF_WIDTH;
	lvcol.fmt=LVCFMT_LEFT;
	int i=0;
	lvcol.pszText="用户名";
	lvcol.iSubItem=i;
	lvcol.cx=70;
	m_ListCtrl.InsertColumn(i++,&lvcol);
	lvcol.pszText="IP地址";
	lvcol.iSubItem=i;
	lvcol.cx=70;
	m_ListCtrl.InsertColumn(i++,&lvcol);
	lvcol.pszText="登陆时间";
	lvcol.iSubItem=i;
	lvcol.cx=70;
	m_ListCtrl.InsertColumn(i++,&lvcol);

	ListUser();
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CUserList::OnButtonAddtodisablelist() 
{//add these users'ip to config.ini and delete these item from list.
 //if these users are on line then disconnect
//	int i,iState;
//	int nItemSelected=m_ListCtrl.GetSelectedCount();	//selected item count
//	int nItemCount=m_ListCtrl.GetItemCount();			//get list item count
//	if(nItemSelected<1) return;
//	for(i=nItemCount-1;i>=0;i--)
//	{
//		iState=m_ListCtrl.GetItemState(i,LVIS_SELECTED);
//		if(iState!=0) m_ListCtrl.DeleteItem(i);
//	}

}

LRESULT CUserList::OnUserIn(WPARAM wParam, LPARAM lParam)
{
	m_ListCtrl.DeleteAllItems();
	ListUser();
	return 0;
}

LRESULT CUserList::OnUserQuit(WPARAM wParam, LPARAM lParam)
{
	m_ListCtrl.DeleteAllItems();
	ListUser();
	return 0;
}

void CUserList::OnButtonLetout() 
{//disconnect these users'connection,and delete these item from list.
	int i,iState;
	char name[MAX_NAME_SIZE];
	int nItemSelected=m_ListCtrl.GetSelectedCount();	//selected item count
	int nItemCount=m_ListCtrl.GetItemCount();			//get list item count
	if(nItemSelected<1) return;
	for(i=nItemCount-1;i>=0;i--)
	{
		iState=m_ListCtrl.GetItemState(i,LVIS_SELECTED);
		if(iState!=0)
		{
			m_ListCtrl.GetItemText(i,0,name,MAX_NAME_SIZE);
			g_pchatserver->LetUserOut(name);
		}
	}
}

void CUserList::OnClose() 
{
	objcount--;
	g_pchatserver->SetUserListDlgHandle(NULL);
	CDialog::OnClose();
}

void CUserList::ListUser()
{
	LV_ITEM lvitem;
	ULNode *ptr = g_puserlist;
	int i=0,iPos;

	WaitForSingleObject(g_hClientInfoMutex,INFINITE);
	while(ptr)
	{
		lvitem.mask=LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;
		lvitem.iItem=i;
		lvitem.iSubItem=0;
		lvitem.pszText=ptr->szUsername;
		lvitem.lParam=i;
		iPos=m_ListCtrl.InsertItem(&lvitem);//return the index id of inserted item
		lvitem.mask=LVIF_TEXT;
		lvitem.iItem=iPos;
		lvitem.iSubItem=1;
		lvitem.pszText=ptr->szIP;
		m_ListCtrl.SetItem(&lvitem);
		lvitem.iSubItem=2;
		lvitem.pszText=ptr->sztime;
		m_ListCtrl.SetItem(&lvitem);
		ptr = ptr->next;
		i++;
	}
	ReleaseMutex(g_hClientInfoMutex);
}